#include <jni.h>
#include "stdio.h"
#include "malloc.h"
#include "string.h"
#include "aes_core.c"
#include "aes.h"
#include "base64.c"
#include "fun.c"

char *key_string = "1234567890123";    //密钥
AES_KEY key;    //AES_KEY对象指针
int i = 0;		//用来循环
/**
 * 加密
 */
jstring Java_com_example_test_MainActivity_encrypt(JNIEnv* env, jobject this,jstring jstr) {
	char *str = (*env)->GetStringUTFChars(env, jstr, NULL);		//待加密内容,转换格式
	long strLen = ((strlen(str) / 16) * 16) + 16;				//计算该给字符串的长度  (字符长度/16)*16+16  以确保长度为16的倍数

	//开始AES加密
	char * aesEnc = malloc(strLen);
	memset(aesEnc, 0, strLen);
	AES_set_encrypt_key(key_string, 256, &key);									//设置AES加密密钥
	for (i = 0; i < strlen(str); i += 16)AES_encrypt(str + i, aesEnc + i, &key);	//循环进行AES加密

	//开始Base64一次加密
	char *basEnc = base64_encode(aesEnc, strlen(aesEnc));    //Base64加密

	//拼接长度到 加密字符               在加密内容后拼接     原字符串长度
	char len[strLen+2];
	sprintf(len,"%d__",strLen);
	char *len_str = str_contact(len,basEnc);

	//进行Base64二次加密
	char *result = base64_encode(len_str, strlen(len_str));    //Base64加密

	//转换为 jstring 并返回
	return (*env)->NewStringUTF(env, result);
}

/**
 * 解密
 */
jstring Java_com_example_test_MainActivity_decrypt(JNIEnv* env, jobject this,jstring jstr) {
	char *strs = (*env)->GetStringUTFChars(env, jstr, NULL);	//获取待揭秘内容,转换格式

	//进行Base64一次解密
	char *len_str = base64_decode(strs, strlen(strs));   //Base64解密，解密basEnc，得basDec

	//分割字符串
	char str[strlen(len_str)]; 	//原始字符串
	char cstrlen[16];			//源字符串长度
	sscanf(len_str, "%[0-9]__%[^.]", cstrlen,str);      //获取字符串内容
	long strLen = atoi(cstrlen);	//截取字符串原长度

	//进行Base64二次解密
	char *basDec = base64_decode(str, strlen(str));   //Base64解密，解密basEnc，得basDec

	//进行AES解密
	char * aesDec = malloc(strLen);
	memset(aesDec, 0, strLen);
	AES_set_decrypt_key(key_string,256,&key);           //设置AES解密密钥
	for(i=0;i<strLen;i+=16)AES_decrypt(basDec+i,aesDec+i,&key);         //进行AES解密，解密basDec，得aesDec

	//转换为 jstring 并返回
	return (*env)->NewStringUTF(env, aesDec);

}

